#include <iostream>
using namespace std;

const int N = 10010; //云朵的数量

int n, m, k;    //钱有多少
int c[N], d[N]; //记录云朵的性质
int p[N];       //并查集，记录云朵的捆绑
int a, b;
int f[N]; //01背包问题的状态表示，这里直接滚动数组优化，不然不好层层迭代

int find(int x)
{
    if (p[x] == x)
        return x;
    return p[x] = find(p[x]);
}

int main()
{
    freopen("cin.txt", "r", stdin);
    cin >> n >> m >> k;
    for (int i = 1; i <= n; ++i)
        p[i] = i;                //初始化并查集
    for (int i = 1; i <= n; ++i) //记录每一朵云的性质
        cin >> c[i] >> d[i];
    for (int i = 0; i < m; ++i) //合并要一起卖的东西
    {
        cin >> a >> b;
        if (find(a) == find(b)) //如果这俩同源
            continue;           //那直接下一把嘛，还合并和锤子
        c[p[b]] += c[p[a]];
        d[p[b]] += d[p[a]]; //先合并价格和价值
        p[p[a]] = p[b];     //不然就合并嘛
    }
    //下面对各个集合作01背包问题即可
    for (int i = 1; i <= n; ++i)                      //遍历所有货物
        if (i == p[i])                                //只有遇到根节点才考虑更新
            for (int j = k; j >= c[i]; --j)           //倒序更新
                f[j] = max(f[j], f[j - c[i]] + d[i]); //买或者不买
    cout << f[k];
    return 0;
}